package rothag.views;

import java.awt.event.ActionEvent;
import rothag.graphics.effect.*;
import com.sun.awt.AWTUtilities;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.Toolkit;
import java.awt.event.ActionListener;
import java.util.Timer;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import rothag.controller.MainController;
import rothag.graphics.*;

/**
 * @author Gaetan, Gulian
 */
public class MainJFrame extends JFrame implements ActionListener {

    private MainController controller;
    private ImageJPanel imagePanel;
    private MenuItem homeMenu;
    private MenuItem nouvellePartie;
    private MenuItem chargerPartie;
    private MenuItem sauvegarderPartie;
    private MenuItem help;
    private MenuItem quitter;

    /** Creates new form MainJFrame */
    public MainJFrame(MainController controller) {
        this.controller = controller;

        setSize(GraphicsParameters.mainWidth, GraphicsParameters.mainHeight);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        // Image de fond
        imagePanel = new ImageJPanel(this.controller);
        getContentPane().setLayout(new BorderLayout());
        getContentPane().add(imagePanel, BorderLayout.CENTER);

        // Menu
        MenuBar menuBar = new MenuBar();

        Menu fichier = new Menu("Fichier");


        menuBar.add(fichier);


        homeMenu = new MenuItem("Menu principal");
        homeMenu.addActionListener(this);
        nouvellePartie = new MenuItem("Nouvelle partie");
        nouvellePartie.addActionListener(this);
        chargerPartie = new MenuItem("Charger partie");
        chargerPartie.addActionListener(this);
        sauvegarderPartie = new MenuItem("Sauvegarder partie");
        sauvegarderPartie.addActionListener(this);
        help = new MenuItem("Manuel utilisateur");
        help.addActionListener(this);
        quitter = new MenuItem("Quitter");
        quitter.addActionListener(this);

        fichier.add(homeMenu);
        fichier.add(nouvellePartie);
        fichier.add(chargerPartie);
        fichier.add(sauvegarderPartie);
        fichier.add(help);
        fichier.add(quitter);

        setMenuBar(menuBar);

        // FadeIn
        try {
            AWTUtilities.setWindowOpacity(this, 0f);
            Timer timer = new Timer();
            timer.schedule(new FaderIn((JFrame) this), 500, 20);
        } catch (Exception e) {
            System.err.println(e.getMessage());
            //GraphicsHelper.afficherErreur("Erreur", "Effet de fade-in impossible, version de java trop récente.", this).setVisible(true);
        }

        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (screen.width - getSize().width) / 2;
        int y = (screen.height - getSize().height) / 2;

        if (x < 0) {
            x = 0;
        }
        if (y < 0) {
            y = 0;
        }
        
        setLocation(x, y);
    }

    public ImageJPanel getImagePanel() {
        return imagePanel;
    }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == help) {
            imagePanel.afficherHelp();
        } else if (e.getSource() != sauvegarderPartie) {
            boolean goTo = true;

            if (imagePanel.getMode() == ImageJPanel.MODE_PARTIE) {
                JOptionPane pane = new JOptionPane("Voulez-vous sauvegarder la partie en cours ?", JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_NO_CANCEL_OPTION);
                JDialog dialog = pane.createDialog(pane, "");
                dialog.setVisible(true);

                Integer valeur = (Integer) pane.getValue();
                if (valeur == JOptionPane.CANCEL_OPTION) {
                    goTo = false;
                } else if (valeur == JOptionPane.YES_OPTION) {
                    try {
                        controller.enregistrerPartie();
                        JOptionPane.showMessageDialog(this, "Enregistrement effectué.");
                    } catch (Exception ex) {
                        goTo = false;
                        GraphicsHelper.afficherErreur("Erreur lors de la sauvegarde", "Erreur lors de la lecture du fichier de sauvegarde. Veuillez supprimer le fichier savegame.rothag et réessayer.", this).setVisible(true);
                    }
                }
            }

            if (goTo) {
                if (e.getSource() == homeMenu) {
                    imagePanel.setMode(ImageJPanel.MODE_MENU);
                } else if (e.getSource() == nouvellePartie) {
                    imagePanel.setMode(ImageJPanel.MODE_CREER);
                } else if (e.getSource() == chargerPartie) {
                    imagePanel.setMode(ImageJPanel.MODE_CHARGER);
                } else if (e.getSource() == quitter) {
                    System.exit(0);
                }
            }
        } else {
            if (imagePanel.getMode() == ImageJPanel.MODE_PARTIE) {
                try {
                    controller.enregistrerPartie();
                    JOptionPane.showMessageDialog(this, "Enregistrement effectué.");
                } catch (Exception ex) {
                    GraphicsHelper.afficherErreur("Erreur lors de la sauvegarde", "Erreur lors de la lecture du fichier de sauvegarde. Veuillez supprimer le fichier savegame.rothag et réessayer.", this).setVisible(true);
                }
            } else {
                GraphicsHelper.afficherErreur("", "Aucune partie en cours.", this).setVisible(true);
            }
        }
    }
}
